home *** CD-ROM | disk | FTP | other *** search
- ;------------------------------------------------------------------------------
- ;This remote code performs (after modifications) module operations:
- ;loading, unloading and testing presence of the module
-
- ALIGN 4 ;for better copying
- UnloadScout :
-
- ASSUME EDI: PTR DWORD
-
- DllOperation EQU [EDI][_DllOperation - UnloadDLL]
- FreeLibrary EQU [EDI][_FreeLibrary - UnloadDLL]
- GetProcAddr EQU [EDI][_GetProcAddr - UnloadDLL]
- UnloadCount EQU [EDI][_UnloadCount - UnloadDLL]
- CallDllApi EQU [EDI][_CallDllApi - UnloadDLL]
-
- UnloadThread PROC
- PUSHp EAX, EDI
- CALL UnloadDelta
- UnloadDelta:
- POP EDI
- ADD EDI, (UnloadDLL - UnloadDelta) ;now everything is realtive to UnloadDLL
-
- SUB EAX, EAX
- CALL @F
-
- ;==============TxHandler exception handler
- MOV EDX, [ESP+12] ;context
- CALL UnloadDelta1 ;get delta
- UnloadDelta1:
- POP EAX
- ADD EDX, CONTEXT.regEip
- ADD EAX, (UnloadDrWatson-UnloadDelta1) ;new EIP = DrWatson
- PUSH [ESP+8] ;new ESP
- MOV [EDX+CONTEXT.regEip-CONTEXT.regEip], EAX
- POP [EDX+CONTEXT.regEsp-CONTEXT.regEip]
- SUB EAX, EAX ;ExceptionContinueExecution
- RETN
- ;==============TxHandler
- @@:
- PUSH FS:FS:(TEB PTR [EAX]).ExceptionList ;build xframe , required!
- MOV FS:FS:(TEB PTR [EAX]).ExceptionList, ESP
-
- NextLoop::
- sWin32 DllOperation, EDI ;call GetModuleHandle or LoadLibrary
- DEC UnloadCount ;how many times
- _JEJL::
- JE Unloaded ;change to JL if Unload, to JNE NextLoop if LoadAndCall
- ToCallProc::
- JMP NextLoop ;change to JMP FreeLib if Unload, to JMP CallProc if LoadAnCall
- FreeLib::
- sWin32 FreeLibrary, EAX
- JMP NextLoop
- CallProc::
- TEST EAX, EAX
- JE Unloaded ;wanted module is mot present
- PUSH EAX ;save module base
- MOV ECX, CallDllApi
- TEST ECX, ECX ;NULL -> call nothing
- JNE @F
- LEA ECX, [EDI+MAX_PATH] ;ordinal or address of api name are placed beyond module name
- @@:
- sWin32 GetProcAddr, EAX, ECX ;get address of api
- MOV ECX, EAX ;api address
- POP EAX ;restore module base
- JECXZ Unloaded ;api doesn't exist
- sWin32 ECX ;call wanted api
- Unloaded:
- POP FS:TEB.ExceptionList ;remove my xframe
- POP EDX ;remove my xframe
- POPp EDI, ECX ;restore used registers
- UnloadStop::
- DWORD 0, 0, 0 ;place reserved for RemoteExec
- UnloadDrWatson:
- oMOV EAX, ErrorRemoteExec ;was exception
- JMP Unloaded
- UnloadThread ENDP
-
- ASSUME EDI :NOTHING
- ALIGN 4
- _DllOperation DWORD 0 ;LoadLibrary or GetModuleHandle
- _FreeLibrary DWORD 0
- _GetProcAddr DWORD 0
- _CallDllApi DWORD 0 ;for LoadAndCall, address of api name or ordinal or NULL
- _UnloadCount DWORD 0 ;how many times to perform wanted operation
- UnloadDLL LABEL ACHAR ;here is ModuleName (size MAX_PATH) followed
- ;DllApiName (size MAX_PATH)
- UnloadSize0 EQU (($-UnloadScout+3) AND NOT 3) ;pure block size dword aligned
- UnloadSize EQU (($-UnloadScout+MAX_PATH*2+3) AND NOT 3) ;overall size dword aligned
- ;------------------------------------------------------------------------------